{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR: Could not find a version that satisfies the requirement struct (from versions: none)\n",
      "ERROR: No matching distribution found for struct\n"
     ]
    }
   ],
   "source": [
    "pip install struct"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack(\">i\",2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x02'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "struct.pack(\">b\",2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "=========\n",
      "47040000\n",
      "=========\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "IOPub data rate exceeded.\n",
      "The notebook server will temporarily stop sending output\n",
      "to the client in order to avoid crashing it.\n",
      "To change this limit, set the config variable\n",
      "`--NotebookApp.iopub_data_rate_limit`.\n",
      "\n",
      "Current values:\n",
      "NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)\n",
      "NotebookApp.rate_limit_window=3.0 (secs)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open(r\"C:\\Users\\Administrator\\Downloads\\第七周机器学习_分类训练\\第七周课件\\MNIST_data\\train-images-idx3-ubyte\",\"rb\") as f :\n",
    "    buffer = f.read(4 * 4)  # 4个int\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    print(\"===\"*3)\n",
    "    print(head[1]*head[2]*head[3])\n",
    "    buffer = f.read(head[1]*head[2]*head[3])\n",
    "    print(\"===\"*3)\n",
    "    print(buffer)\n",
    "    data = struct.unpack(\">{}b\".format(head[1]*head[2]*head[3]),buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data,(head[1],head[2],head[3],))\n",
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i],cmap = \"gray\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'data': array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]]),\n",
       " 'target': array(['5', '0', '4', ..., '4', '5', '6'], dtype=object),\n",
       " 'frame': None,\n",
       " 'feature_names': ['pixel1',\n",
       "  'pixel2',\n",
       "  'pixel3',\n",
       "  'pixel4',\n",
       "  'pixel5',\n",
       "  'pixel6',\n",
       "  'pixel7',\n",
       "  'pixel8',\n",
       "  'pixel9',\n",
       "  'pixel10',\n",
       "  'pixel11',\n",
       "  'pixel12',\n",
       "  'pixel13',\n",
       "  'pixel14',\n",
       "  'pixel15',\n",
       "  'pixel16',\n",
       "  'pixel17',\n",
       "  'pixel18',\n",
       "  'pixel19',\n",
       "  'pixel20',\n",
       "  'pixel21',\n",
       "  'pixel22',\n",
       "  'pixel23',\n",
       "  'pixel24',\n",
       "  'pixel25',\n",
       "  'pixel26',\n",
       "  'pixel27',\n",
       "  'pixel28',\n",
       "  'pixel29',\n",
       "  'pixel30',\n",
       "  'pixel31',\n",
       "  'pixel32',\n",
       "  'pixel33',\n",
       "  'pixel34',\n",
       "  'pixel35',\n",
       "  'pixel36',\n",
       "  'pixel37',\n",
       "  'pixel38',\n",
       "  'pixel39',\n",
       "  'pixel40',\n",
       "  'pixel41',\n",
       "  'pixel42',\n",
       "  'pixel43',\n",
       "  'pixel44',\n",
       "  'pixel45',\n",
       "  'pixel46',\n",
       "  'pixel47',\n",
       "  'pixel48',\n",
       "  'pixel49',\n",
       "  'pixel50',\n",
       "  'pixel51',\n",
       "  'pixel52',\n",
       "  'pixel53',\n",
       "  'pixel54',\n",
       "  'pixel55',\n",
       "  'pixel56',\n",
       "  'pixel57',\n",
       "  'pixel58',\n",
       "  'pixel59',\n",
       "  'pixel60',\n",
       "  'pixel61',\n",
       "  'pixel62',\n",
       "  'pixel63',\n",
       "  'pixel64',\n",
       "  'pixel65',\n",
       "  'pixel66',\n",
       "  'pixel67',\n",
       "  'pixel68',\n",
       "  'pixel69',\n",
       "  'pixel70',\n",
       "  'pixel71',\n",
       "  'pixel72',\n",
       "  'pixel73',\n",
       "  'pixel74',\n",
       "  'pixel75',\n",
       "  'pixel76',\n",
       "  'pixel77',\n",
       "  'pixel78',\n",
       "  'pixel79',\n",
       "  'pixel80',\n",
       "  'pixel81',\n",
       "  'pixel82',\n",
       "  'pixel83',\n",
       "  'pixel84',\n",
       "  'pixel85',\n",
       "  'pixel86',\n",
       "  'pixel87',\n",
       "  'pixel88',\n",
       "  'pixel89',\n",
       "  'pixel90',\n",
       "  'pixel91',\n",
       "  'pixel92',\n",
       "  'pixel93',\n",
       "  'pixel94',\n",
       "  'pixel95',\n",
       "  'pixel96',\n",
       "  'pixel97',\n",
       "  'pixel98',\n",
       "  'pixel99',\n",
       "  'pixel100',\n",
       "  'pixel101',\n",
       "  'pixel102',\n",
       "  'pixel103',\n",
       "  'pixel104',\n",
       "  'pixel105',\n",
       "  'pixel106',\n",
       "  'pixel107',\n",
       "  'pixel108',\n",
       "  'pixel109',\n",
       "  'pixel110',\n",
       "  'pixel111',\n",
       "  'pixel112',\n",
       "  'pixel113',\n",
       "  'pixel114',\n",
       "  'pixel115',\n",
       "  'pixel116',\n",
       "  'pixel117',\n",
       "  'pixel118',\n",
       "  'pixel119',\n",
       "  'pixel120',\n",
       "  'pixel121',\n",
       "  'pixel122',\n",
       "  'pixel123',\n",
       "  'pixel124',\n",
       "  'pixel125',\n",
       "  'pixel126',\n",
       "  'pixel127',\n",
       "  'pixel128',\n",
       "  'pixel129',\n",
       "  'pixel130',\n",
       "  'pixel131',\n",
       "  'pixel132',\n",
       "  'pixel133',\n",
       "  'pixel134',\n",
       "  'pixel135',\n",
       "  'pixel136',\n",
       "  'pixel137',\n",
       "  'pixel138',\n",
       "  'pixel139',\n",
       "  'pixel140',\n",
       "  'pixel141',\n",
       "  'pixel142',\n",
       "  'pixel143',\n",
       "  'pixel144',\n",
       "  'pixel145',\n",
       "  'pixel146',\n",
       "  'pixel147',\n",
       "  'pixel148',\n",
       "  'pixel149',\n",
       "  'pixel150',\n",
       "  'pixel151',\n",
       "  'pixel152',\n",
       "  'pixel153',\n",
       "  'pixel154',\n",
       "  'pixel155',\n",
       "  'pixel156',\n",
       "  'pixel157',\n",
       "  'pixel158',\n",
       "  'pixel159',\n",
       "  'pixel160',\n",
       "  'pixel161',\n",
       "  'pixel162',\n",
       "  'pixel163',\n",
       "  'pixel164',\n",
       "  'pixel165',\n",
       "  'pixel166',\n",
       "  'pixel167',\n",
       "  'pixel168',\n",
       "  'pixel169',\n",
       "  'pixel170',\n",
       "  'pixel171',\n",
       "  'pixel172',\n",
       "  'pixel173',\n",
       "  'pixel174',\n",
       "  'pixel175',\n",
       "  'pixel176',\n",
       "  'pixel177',\n",
       "  'pixel178',\n",
       "  'pixel179',\n",
       "  'pixel180',\n",
       "  'pixel181',\n",
       "  'pixel182',\n",
       "  'pixel183',\n",
       "  'pixel184',\n",
       "  'pixel185',\n",
       "  'pixel186',\n",
       "  'pixel187',\n",
       "  'pixel188',\n",
       "  'pixel189',\n",
       "  'pixel190',\n",
       "  'pixel191',\n",
       "  'pixel192',\n",
       "  'pixel193',\n",
       "  'pixel194',\n",
       "  'pixel195',\n",
       "  'pixel196',\n",
       "  'pixel197',\n",
       "  'pixel198',\n",
       "  'pixel199',\n",
       "  'pixel200',\n",
       "  'pixel201',\n",
       "  'pixel202',\n",
       "  'pixel203',\n",
       "  'pixel204',\n",
       "  'pixel205',\n",
       "  'pixel206',\n",
       "  'pixel207',\n",
       "  'pixel208',\n",
       "  'pixel209',\n",
       "  'pixel210',\n",
       "  'pixel211',\n",
       "  'pixel212',\n",
       "  'pixel213',\n",
       "  'pixel214',\n",
       "  'pixel215',\n",
       "  'pixel216',\n",
       "  'pixel217',\n",
       "  'pixel218',\n",
       "  'pixel219',\n",
       "  'pixel220',\n",
       "  'pixel221',\n",
       "  'pixel222',\n",
       "  'pixel223',\n",
       "  'pixel224',\n",
       "  'pixel225',\n",
       "  'pixel226',\n",
       "  'pixel227',\n",
       "  'pixel228',\n",
       "  'pixel229',\n",
       "  'pixel230',\n",
       "  'pixel231',\n",
       "  'pixel232',\n",
       "  'pixel233',\n",
       "  'pixel234',\n",
       "  'pixel235',\n",
       "  'pixel236',\n",
       "  'pixel237',\n",
       "  'pixel238',\n",
       "  'pixel239',\n",
       "  'pixel240',\n",
       "  'pixel241',\n",
       "  'pixel242',\n",
       "  'pixel243',\n",
       "  'pixel244',\n",
       "  'pixel245',\n",
       "  'pixel246',\n",
       "  'pixel247',\n",
       "  'pixel248',\n",
       "  'pixel249',\n",
       "  'pixel250',\n",
       "  'pixel251',\n",
       "  'pixel252',\n",
       "  'pixel253',\n",
       "  'pixel254',\n",
       "  'pixel255',\n",
       "  'pixel256',\n",
       "  'pixel257',\n",
       "  'pixel258',\n",
       "  'pixel259',\n",
       "  'pixel260',\n",
       "  'pixel261',\n",
       "  'pixel262',\n",
       "  'pixel263',\n",
       "  'pixel264',\n",
       "  'pixel265',\n",
       "  'pixel266',\n",
       "  'pixel267',\n",
       "  'pixel268',\n",
       "  'pixel269',\n",
       "  'pixel270',\n",
       "  'pixel271',\n",
       "  'pixel272',\n",
       "  'pixel273',\n",
       "  'pixel274',\n",
       "  'pixel275',\n",
       "  'pixel276',\n",
       "  'pixel277',\n",
       "  'pixel278',\n",
       "  'pixel279',\n",
       "  'pixel280',\n",
       "  'pixel281',\n",
       "  'pixel282',\n",
       "  'pixel283',\n",
       "  'pixel284',\n",
       "  'pixel285',\n",
       "  'pixel286',\n",
       "  'pixel287',\n",
       "  'pixel288',\n",
       "  'pixel289',\n",
       "  'pixel290',\n",
       "  'pixel291',\n",
       "  'pixel292',\n",
       "  'pixel293',\n",
       "  'pixel294',\n",
       "  'pixel295',\n",
       "  'pixel296',\n",
       "  'pixel297',\n",
       "  'pixel298',\n",
       "  'pixel299',\n",
       "  'pixel300',\n",
       "  'pixel301',\n",
       "  'pixel302',\n",
       "  'pixel303',\n",
       "  'pixel304',\n",
       "  'pixel305',\n",
       "  'pixel306',\n",
       "  'pixel307',\n",
       "  'pixel308',\n",
       "  'pixel309',\n",
       "  'pixel310',\n",
       "  'pixel311',\n",
       "  'pixel312',\n",
       "  'pixel313',\n",
       "  'pixel314',\n",
       "  'pixel315',\n",
       "  'pixel316',\n",
       "  'pixel317',\n",
       "  'pixel318',\n",
       "  'pixel319',\n",
       "  'pixel320',\n",
       "  'pixel321',\n",
       "  'pixel322',\n",
       "  'pixel323',\n",
       "  'pixel324',\n",
       "  'pixel325',\n",
       "  'pixel326',\n",
       "  'pixel327',\n",
       "  'pixel328',\n",
       "  'pixel329',\n",
       "  'pixel330',\n",
       "  'pixel331',\n",
       "  'pixel332',\n",
       "  'pixel333',\n",
       "  'pixel334',\n",
       "  'pixel335',\n",
       "  'pixel336',\n",
       "  'pixel337',\n",
       "  'pixel338',\n",
       "  'pixel339',\n",
       "  'pixel340',\n",
       "  'pixel341',\n",
       "  'pixel342',\n",
       "  'pixel343',\n",
       "  'pixel344',\n",
       "  'pixel345',\n",
       "  'pixel346',\n",
       "  'pixel347',\n",
       "  'pixel348',\n",
       "  'pixel349',\n",
       "  'pixel350',\n",
       "  'pixel351',\n",
       "  'pixel352',\n",
       "  'pixel353',\n",
       "  'pixel354',\n",
       "  'pixel355',\n",
       "  'pixel356',\n",
       "  'pixel357',\n",
       "  'pixel358',\n",
       "  'pixel359',\n",
       "  'pixel360',\n",
       "  'pixel361',\n",
       "  'pixel362',\n",
       "  'pixel363',\n",
       "  'pixel364',\n",
       "  'pixel365',\n",
       "  'pixel366',\n",
       "  'pixel367',\n",
       "  'pixel368',\n",
       "  'pixel369',\n",
       "  'pixel370',\n",
       "  'pixel371',\n",
       "  'pixel372',\n",
       "  'pixel373',\n",
       "  'pixel374',\n",
       "  'pixel375',\n",
       "  'pixel376',\n",
       "  'pixel377',\n",
       "  'pixel378',\n",
       "  'pixel379',\n",
       "  'pixel380',\n",
       "  'pixel381',\n",
       "  'pixel382',\n",
       "  'pixel383',\n",
       "  'pixel384',\n",
       "  'pixel385',\n",
       "  'pixel386',\n",
       "  'pixel387',\n",
       "  'pixel388',\n",
       "  'pixel389',\n",
       "  'pixel390',\n",
       "  'pixel391',\n",
       "  'pixel392',\n",
       "  'pixel393',\n",
       "  'pixel394',\n",
       "  'pixel395',\n",
       "  'pixel396',\n",
       "  'pixel397',\n",
       "  'pixel398',\n",
       "  'pixel399',\n",
       "  'pixel400',\n",
       "  'pixel401',\n",
       "  'pixel402',\n",
       "  'pixel403',\n",
       "  'pixel404',\n",
       "  'pixel405',\n",
       "  'pixel406',\n",
       "  'pixel407',\n",
       "  'pixel408',\n",
       "  'pixel409',\n",
       "  'pixel410',\n",
       "  'pixel411',\n",
       "  'pixel412',\n",
       "  'pixel413',\n",
       "  'pixel414',\n",
       "  'pixel415',\n",
       "  'pixel416',\n",
       "  'pixel417',\n",
       "  'pixel418',\n",
       "  'pixel419',\n",
       "  'pixel420',\n",
       "  'pixel421',\n",
       "  'pixel422',\n",
       "  'pixel423',\n",
       "  'pixel424',\n",
       "  'pixel425',\n",
       "  'pixel426',\n",
       "  'pixel427',\n",
       "  'pixel428',\n",
       "  'pixel429',\n",
       "  'pixel430',\n",
       "  'pixel431',\n",
       "  'pixel432',\n",
       "  'pixel433',\n",
       "  'pixel434',\n",
       "  'pixel435',\n",
       "  'pixel436',\n",
       "  'pixel437',\n",
       "  'pixel438',\n",
       "  'pixel439',\n",
       "  'pixel440',\n",
       "  'pixel441',\n",
       "  'pixel442',\n",
       "  'pixel443',\n",
       "  'pixel444',\n",
       "  'pixel445',\n",
       "  'pixel446',\n",
       "  'pixel447',\n",
       "  'pixel448',\n",
       "  'pixel449',\n",
       "  'pixel450',\n",
       "  'pixel451',\n",
       "  'pixel452',\n",
       "  'pixel453',\n",
       "  'pixel454',\n",
       "  'pixel455',\n",
       "  'pixel456',\n",
       "  'pixel457',\n",
       "  'pixel458',\n",
       "  'pixel459',\n",
       "  'pixel460',\n",
       "  'pixel461',\n",
       "  'pixel462',\n",
       "  'pixel463',\n",
       "  'pixel464',\n",
       "  'pixel465',\n",
       "  'pixel466',\n",
       "  'pixel467',\n",
       "  'pixel468',\n",
       "  'pixel469',\n",
       "  'pixel470',\n",
       "  'pixel471',\n",
       "  'pixel472',\n",
       "  'pixel473',\n",
       "  'pixel474',\n",
       "  'pixel475',\n",
       "  'pixel476',\n",
       "  'pixel477',\n",
       "  'pixel478',\n",
       "  'pixel479',\n",
       "  'pixel480',\n",
       "  'pixel481',\n",
       "  'pixel482',\n",
       "  'pixel483',\n",
       "  'pixel484',\n",
       "  'pixel485',\n",
       "  'pixel486',\n",
       "  'pixel487',\n",
       "  'pixel488',\n",
       "  'pixel489',\n",
       "  'pixel490',\n",
       "  'pixel491',\n",
       "  'pixel492',\n",
       "  'pixel493',\n",
       "  'pixel494',\n",
       "  'pixel495',\n",
       "  'pixel496',\n",
       "  'pixel497',\n",
       "  'pixel498',\n",
       "  'pixel499',\n",
       "  'pixel500',\n",
       "  'pixel501',\n",
       "  'pixel502',\n",
       "  'pixel503',\n",
       "  'pixel504',\n",
       "  'pixel505',\n",
       "  'pixel506',\n",
       "  'pixel507',\n",
       "  'pixel508',\n",
       "  'pixel509',\n",
       "  'pixel510',\n",
       "  'pixel511',\n",
       "  'pixel512',\n",
       "  'pixel513',\n",
       "  'pixel514',\n",
       "  'pixel515',\n",
       "  'pixel516',\n",
       "  'pixel517',\n",
       "  'pixel518',\n",
       "  'pixel519',\n",
       "  'pixel520',\n",
       "  'pixel521',\n",
       "  'pixel522',\n",
       "  'pixel523',\n",
       "  'pixel524',\n",
       "  'pixel525',\n",
       "  'pixel526',\n",
       "  'pixel527',\n",
       "  'pixel528',\n",
       "  'pixel529',\n",
       "  'pixel530',\n",
       "  'pixel531',\n",
       "  'pixel532',\n",
       "  'pixel533',\n",
       "  'pixel534',\n",
       "  'pixel535',\n",
       "  'pixel536',\n",
       "  'pixel537',\n",
       "  'pixel538',\n",
       "  'pixel539',\n",
       "  'pixel540',\n",
       "  'pixel541',\n",
       "  'pixel542',\n",
       "  'pixel543',\n",
       "  'pixel544',\n",
       "  'pixel545',\n",
       "  'pixel546',\n",
       "  'pixel547',\n",
       "  'pixel548',\n",
       "  'pixel549',\n",
       "  'pixel550',\n",
       "  'pixel551',\n",
       "  'pixel552',\n",
       "  'pixel553',\n",
       "  'pixel554',\n",
       "  'pixel555',\n",
       "  'pixel556',\n",
       "  'pixel557',\n",
       "  'pixel558',\n",
       "  'pixel559',\n",
       "  'pixel560',\n",
       "  'pixel561',\n",
       "  'pixel562',\n",
       "  'pixel563',\n",
       "  'pixel564',\n",
       "  'pixel565',\n",
       "  'pixel566',\n",
       "  'pixel567',\n",
       "  'pixel568',\n",
       "  'pixel569',\n",
       "  'pixel570',\n",
       "  'pixel571',\n",
       "  'pixel572',\n",
       "  'pixel573',\n",
       "  'pixel574',\n",
       "  'pixel575',\n",
       "  'pixel576',\n",
       "  'pixel577',\n",
       "  'pixel578',\n",
       "  'pixel579',\n",
       "  'pixel580',\n",
       "  'pixel581',\n",
       "  'pixel582',\n",
       "  'pixel583',\n",
       "  'pixel584',\n",
       "  'pixel585',\n",
       "  'pixel586',\n",
       "  'pixel587',\n",
       "  'pixel588',\n",
       "  'pixel589',\n",
       "  'pixel590',\n",
       "  'pixel591',\n",
       "  'pixel592',\n",
       "  'pixel593',\n",
       "  'pixel594',\n",
       "  'pixel595',\n",
       "  'pixel596',\n",
       "  'pixel597',\n",
       "  'pixel598',\n",
       "  'pixel599',\n",
       "  'pixel600',\n",
       "  'pixel601',\n",
       "  'pixel602',\n",
       "  'pixel603',\n",
       "  'pixel604',\n",
       "  'pixel605',\n",
       "  'pixel606',\n",
       "  'pixel607',\n",
       "  'pixel608',\n",
       "  'pixel609',\n",
       "  'pixel610',\n",
       "  'pixel611',\n",
       "  'pixel612',\n",
       "  'pixel613',\n",
       "  'pixel614',\n",
       "  'pixel615',\n",
       "  'pixel616',\n",
       "  'pixel617',\n",
       "  'pixel618',\n",
       "  'pixel619',\n",
       "  'pixel620',\n",
       "  'pixel621',\n",
       "  'pixel622',\n",
       "  'pixel623',\n",
       "  'pixel624',\n",
       "  'pixel625',\n",
       "  'pixel626',\n",
       "  'pixel627',\n",
       "  'pixel628',\n",
       "  'pixel629',\n",
       "  'pixel630',\n",
       "  'pixel631',\n",
       "  'pixel632',\n",
       "  'pixel633',\n",
       "  'pixel634',\n",
       "  'pixel635',\n",
       "  'pixel636',\n",
       "  'pixel637',\n",
       "  'pixel638',\n",
       "  'pixel639',\n",
       "  'pixel640',\n",
       "  'pixel641',\n",
       "  'pixel642',\n",
       "  'pixel643',\n",
       "  'pixel644',\n",
       "  'pixel645',\n",
       "  'pixel646',\n",
       "  'pixel647',\n",
       "  'pixel648',\n",
       "  'pixel649',\n",
       "  'pixel650',\n",
       "  'pixel651',\n",
       "  'pixel652',\n",
       "  'pixel653',\n",
       "  'pixel654',\n",
       "  'pixel655',\n",
       "  'pixel656',\n",
       "  'pixel657',\n",
       "  'pixel658',\n",
       "  'pixel659',\n",
       "  'pixel660',\n",
       "  'pixel661',\n",
       "  'pixel662',\n",
       "  'pixel663',\n",
       "  'pixel664',\n",
       "  'pixel665',\n",
       "  'pixel666',\n",
       "  'pixel667',\n",
       "  'pixel668',\n",
       "  'pixel669',\n",
       "  'pixel670',\n",
       "  'pixel671',\n",
       "  'pixel672',\n",
       "  'pixel673',\n",
       "  'pixel674',\n",
       "  'pixel675',\n",
       "  'pixel676',\n",
       "  'pixel677',\n",
       "  'pixel678',\n",
       "  'pixel679',\n",
       "  'pixel680',\n",
       "  'pixel681',\n",
       "  'pixel682',\n",
       "  'pixel683',\n",
       "  'pixel684',\n",
       "  'pixel685',\n",
       "  'pixel686',\n",
       "  'pixel687',\n",
       "  'pixel688',\n",
       "  'pixel689',\n",
       "  'pixel690',\n",
       "  'pixel691',\n",
       "  'pixel692',\n",
       "  'pixel693',\n",
       "  'pixel694',\n",
       "  'pixel695',\n",
       "  'pixel696',\n",
       "  'pixel697',\n",
       "  'pixel698',\n",
       "  'pixel699',\n",
       "  'pixel700',\n",
       "  'pixel701',\n",
       "  'pixel702',\n",
       "  'pixel703',\n",
       "  'pixel704',\n",
       "  'pixel705',\n",
       "  'pixel706',\n",
       "  'pixel707',\n",
       "  'pixel708',\n",
       "  'pixel709',\n",
       "  'pixel710',\n",
       "  'pixel711',\n",
       "  'pixel712',\n",
       "  'pixel713',\n",
       "  'pixel714',\n",
       "  'pixel715',\n",
       "  'pixel716',\n",
       "  'pixel717',\n",
       "  'pixel718',\n",
       "  'pixel719',\n",
       "  'pixel720',\n",
       "  'pixel721',\n",
       "  'pixel722',\n",
       "  'pixel723',\n",
       "  'pixel724',\n",
       "  'pixel725',\n",
       "  'pixel726',\n",
       "  'pixel727',\n",
       "  'pixel728',\n",
       "  'pixel729',\n",
       "  'pixel730',\n",
       "  'pixel731',\n",
       "  'pixel732',\n",
       "  'pixel733',\n",
       "  'pixel734',\n",
       "  'pixel735',\n",
       "  'pixel736',\n",
       "  'pixel737',\n",
       "  'pixel738',\n",
       "  'pixel739',\n",
       "  'pixel740',\n",
       "  'pixel741',\n",
       "  'pixel742',\n",
       "  'pixel743',\n",
       "  'pixel744',\n",
       "  'pixel745',\n",
       "  'pixel746',\n",
       "  'pixel747',\n",
       "  'pixel748',\n",
       "  'pixel749',\n",
       "  'pixel750',\n",
       "  'pixel751',\n",
       "  'pixel752',\n",
       "  'pixel753',\n",
       "  'pixel754',\n",
       "  'pixel755',\n",
       "  'pixel756',\n",
       "  'pixel757',\n",
       "  'pixel758',\n",
       "  'pixel759',\n",
       "  'pixel760',\n",
       "  'pixel761',\n",
       "  'pixel762',\n",
       "  'pixel763',\n",
       "  'pixel764',\n",
       "  'pixel765',\n",
       "  'pixel766',\n",
       "  'pixel767',\n",
       "  'pixel768',\n",
       "  'pixel769',\n",
       "  'pixel770',\n",
       "  'pixel771',\n",
       "  'pixel772',\n",
       "  'pixel773',\n",
       "  'pixel774',\n",
       "  'pixel775',\n",
       "  'pixel776',\n",
       "  'pixel777',\n",
       "  'pixel778',\n",
       "  'pixel779',\n",
       "  'pixel780',\n",
       "  'pixel781',\n",
       "  'pixel782',\n",
       "  'pixel783',\n",
       "  'pixel784'],\n",
       " 'target_names': ['class'],\n",
       " 'DESCR': \"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges  \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown  \\n**Please cite**:  \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples  \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field.  \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets.  \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\",\n",
       " 'details': {'id': '554',\n",
       "  'name': 'mnist_784',\n",
       "  'version': '1',\n",
       "  'format': 'ARFF',\n",
       "  'upload_date': '2014-09-29T03:28:38',\n",
       "  'licence': 'Public',\n",
       "  'url': 'https://www.openml.org/data/v1/download/52667/mnist_784.arff',\n",
       "  'file_id': '52667',\n",
       "  'default_target_attribute': 'class',\n",
       "  'tag': ['AzurePilot',\n",
       "   'OpenML-CC18',\n",
       "   'OpenML100',\n",
       "   'study_1',\n",
       "   'study_123',\n",
       "   'study_41',\n",
       "   'study_99',\n",
       "   'vision'],\n",
       "  'visibility': 'public',\n",
       "  'status': 'active',\n",
       "  'processing_date': '2020-11-20 20:12:09',\n",
       "  'md5_checksum': '0298d579eb1b86163de7723944c7e495'},\n",
       " 'categories': {},\n",
       " 'url': 'https://www.openml.org/d/554'}"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "from sklearn.datasets import fetch_openml  \n",
    "mnist_data = fetch_openml(\"mnist_784\",data_home = \"./\")\n",
    "# mnist = fetch_openml('mnist_784', version=1, cache=True)\n",
    "mnist_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\Administrator\\\\traning_python\\\\8800'"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.getcwd()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 'DESCR'数据集描述\n",
    "# data包含一个数组，每个实例为一行，每个特征为一列\n",
    "# target包含一个带有标签的数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X , y = mnist_data[\"data\"], mnist_data[\"target\"]\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline \n",
    "import matplotlib \n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28,28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   4., 149.,\n",
       "       255., 184.,  12.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,  11., 133., 212., 253., 253., 253., 102.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0., 162., 236., 253., 253.,\n",
       "       253., 253., 253.,  55.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "        35., 196., 253., 253., 253., 253., 253., 253., 239.,  18.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  89., 249., 253., 253., 253., 185.,\n",
       "       253., 253., 177.,  24.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 129.,\n",
       "       247., 253., 253., 165., 150., 205., 253., 139.,   3.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,  89., 247., 253., 240., 131.,  85., 221.,\n",
       "       253., 253.,  84.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   4., 187.,\n",
       "       253., 253., 236., 139., 252., 253., 253., 253.,  84.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,  21., 253., 253., 253., 253., 253., 253.,\n",
       "       253., 253., 248.,  53.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  99.,\n",
       "       253., 253., 253., 253., 253., 214., 253., 253., 179.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   4., 186., 251., 253., 249., 172.,\n",
       "       133., 253., 253., 137.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,  49.,  94.,   6.,   0., 212., 253., 253.,  39.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       126., 253., 253., 197.,   6.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  27., 234., 253., 253.,  94.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       100., 253., 253., 239.,  11.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  61., 249., 253., 253.,  79.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   5.,\n",
       "       109., 253., 253., 193.,   4.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  66., 253., 253., 253.,  30.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       147., 253., 253., 182.,   2.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  99., 248., 253., 222.,  13.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'9'"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train , X_test, y_train ,y_test = X[:60000] , X[60000:] , y[:60000], y[60000:]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2899, 15338,  1861, ..., 18952, 19080, 32449])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集数据分布均匀，有些机器学习算法对训练集实例的顺序敏感\n",
    "import numpy as np\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train ,y_train = X_train[shuffle_index], y_train[shuffle_index]\n",
    "X_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 识别数字5，二元分类5或者非5\n",
    "# 创建目标向量\n",
    "y_train_5 = (y_train == \"5\" )\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       ...,\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [ True, False, False, ..., False, False, False]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5 = (y_test == 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SGD梯度下降分类器，适合非常大的数据集，独立处理训练集数据，一次一个，适合在线学习\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42)\n",
    "sgd_clf.fit( X_train , y_train_5)\n",
    "\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核\n",
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.96395, 0.9563 , 0.9617 ])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评估分类器比评估回归需要困难得多\n",
    "\n",
    "# 3个折叠，正确率达到95%以上\n",
    "\n",
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv = 3,scoring = \"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把每张图都分成非5\n",
    "\n",
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y = None):\n",
    "        pass\n",
    "    def predict(self , X):\n",
    "        return np.zeros((len(X),1),dtype = bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((len(X),1),dtype = bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.91185, 0.9083 , 0.9088 ])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5,cv=3,scoring = \"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准确率超过90%，因为5的图像大约只有10%，你猜一张图不是5，90%的概率你是正确的\n",
    "## 这说明准确率无法成为分类器的首要性指标，特别是当你处理偏科数据集，某些类比其他类更为频繁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评估分类器性能更好的方法是混淆矩阵\n",
    "# A类别实例被分为B类别的次数\n",
    "# 想要知道分类器将数字3和数字5混淆多少次，通过混淆矩阵的5行3列\n",
    "\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5,cv=3)\n",
    "\n",
    "y_train_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 与cross_val_score相比\n",
    "## 同样执行交叉验证\n",
    "## 返回的不是评估分数，是每个折叠的预测\n",
    "## 每一个实例在模型预测时使用的数据，在训练期间从未有过"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54146,   433],\n",
       "       [ 1928,  3493]], dtype=int64)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 行表示实际类比，列表示预测类别\n",
    "# 第一行 第一列 53272被正确分为 非5 ，真负类\n",
    "# 第一行 第二列 1307被正确分为 5 ，假正类\n",
    "# 第二行 第一列 1077被正确分为 非5 ，真负类\n",
    "# 第二行 第二列 4344被正确分为 5 ，假正类\n",
    "# 这种衡量方式太复杂，我们可以用更简单的指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions = y_train_5\n",
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 正类预测的准确率被称为分类器的精度\n",
    "\n",
    "# 精度 = TP / (TP + FP)\n",
    "# TP时真正类的数量 ，  FP是假正类的数量\n",
    "\n",
    "# 召回率TPR = TP /(TP  +  FN)\n",
    "# FN 是假负类的数量\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 精度和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8897096281202241"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "precision_score(y_train_5, y_train_pred) # 4327 / (4327+ 1276)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6443460616122486"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)  # 4327/(4327+1094)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 说明检测一张图的时候，只有的%概率是准确的，而且只有%的数字5被检测出来\n",
    "# 精度和召回率合成单一指标，成为F1分数，谐波平均数\n",
    "# 平均值平等对待所有的值，谐波平均值会给与较低值更高的权重，只有召回率和精度都很高时，才能获得较高的F1分数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7474055846795763"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5 , y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# F1分数对哪些具有相近精度和召回率的分类器更有利，这不一定符合你的期望\n",
    "# 有时候你更关系精度，有时候你更关系召回率\n",
    "# 训练一个分类器检测儿童可以放心观看的视频，你可能要求拦截了很多好的视频，低召回率，保留下来的都是安全的视频,高精度\n",
    "# 不能同时增加精度并减少召回率，反之亦然"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度与召回率权衡"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 提高阈值，精度提高，召回率降低；\n",
    "# 降低阈值，精度降低，召回率提高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\anaconda\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:940: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n"
     ]
    }
   ],
   "source": [
    "# 如何设置阈值\n",
    "\n",
    "# 用predict_proba得到每个实例属于正类的概率，然后对概率切一下，以LogisticRegression为例\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "clf = LogisticRegression()\n",
    "clf.fit(X_train, y_train)\n",
    "pre_proba = clf.predict_proba(X_test)[:,1]\n",
    "threshold = 0.75 # 阈值设置为0.75\n",
    "pred_label = pre_proba > threshold\n",
    "\n",
    "# pred_proba是每个实例为真的概率\n",
    "# 假设阈值为0.75\n",
    "# pred_label里的True就是概率大于0.75的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 返回决策值decision_function\n",
    "y_scores = sgd_clf.decision_function([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  提高阈值可以降低召回率，提高阈值到200000，就错了这个图\n",
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold )\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 如何决定使用什么阈值\n",
    "# 返回决策值，而不是预测结果\n",
    "\n",
    "y_scores = cross_val_predict(sgd_clf ,X_train, y_train_5,cv=3,\n",
    "                            method = \"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 有了y_scores，可以计算所有可能的阈值的精度和召回率\n",
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions ,recalls , thresholds = precision_recall_curve(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib绘制精度和召回相对于阈值的函数图\n",
    "\n",
    "def plot_precision_recall_vs_threshold(precisions ,recalls,thresholds):\n",
    "    plt.plot(thresholds,precisions[:-1],\"b--\",label = \"precision\",linewidth=2)\n",
    "    plt.plot(thresholds,recalls[:-1],\"g--\",label = \"recall\",linewidth=2)\n",
    "    plt.xlabel(\"Threshold\",fontsize=16)\n",
    "    plt.legend(loc = \"upper left\", fontsize=16)\n",
    "    plt.ylim([0,1])\n",
    "    \n",
    "plt.figure(figsize=(8,4))\n",
    "plot_precision_recall_vs_threshold(precisions ,recalls,thresholds)\n",
    "plt.xlim([-700000,700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 目标设置为90的精度，阈值大概在3wan左右\n",
    "y_train_pred_90 = (y_scores > 30000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0007378712414683637"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"召回\", fontsize=16)\n",
    "    plt.ylabel(\"精度\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 总结\n",
    "# 获得了一个90%精度的分类器，但如果召回率太低，精度再高，也不怎么有用\n",
    "# 如果工作中需要99%的精度，你应该回应召回率多少？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ROC曲线"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 本质是 真正类率tpr和假正类率fpr（错误的分为正类的负类实例比例\n",
    "# 与召回/精度曲线非常相似"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr,tpr,thresholds = roc_curve(y_train_5,y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cctA31rL3Llz6dGjB1u2bOGVV15h5MiRTscSERGXcEfpu2Qp38yZM7nsssvo1asXOTk5nHPOOU5HEhERF3HFQr5I35zHWosxhjFjxhAXF8df/vIXvF6v07FERMRl3DHSj9DSDwQC3HvvvYwYMQJrLW3atOHmm29W4YuISK1wR+lH4PT+9u3bOfvss7npppsIBAKUlJQ4HUlERFzOHaUfYZ2/ZMkSMjMzWb58OY899hj//ve/SUxMdDqWiIi4nCvO6ecVR87944uKipgwYQINGzZk6dKldO7c2elIIiISJVxR+vGxdf8c+KZNm2jevDlJSUm88cYbnHjiiSQlJTkdS0REoogrpvfrxdft312ef/55OnfuzD333ANAly5dVPgiIhJ2rij9uqqwsJBJkyYxatQoOnXqxMUXX+x0JBERiWKuKP26uJDv888/Jysri7lz53LrrbeyfPlyTjjhBKdjiYhIFKvb8+JVVAc7n+LiYoqKili6dCkDBw50Oo6IiIg7Rvp1Zai/e/du5s6dC0DPnj1Zt26dCl9EROoMV5R+Xaj8d999l27dunHVVVfxww8/ABAXF+dsKBERkQO4o/QdbH2fz8f06dM588wzSUxM5KOPPtK5exERqZNccU7fKdZazjvvPF5//XXGjRvHww8/TEpKitOxREREDskVpe/U3vvGGC6++GJGjx7NuHHjHMkgIiJSVe4o/TB2fklJCTfeeCPdu3dn4sSJjB07NnwvLiIicgzccU4/TK+zdu1aevXqxUMPPcR3330XplcVERGpGRrpV4G1lnnz5nHttdeSlJTEq6++ytlnn127LyoiIlLDXDHSr23Z2dlcdtll9OrVi5ycHBW+iIhEJHeM9Gtpgn/nzp1kZGRw6qmnsnjxYgYPHozXW/fv6CciInIo7hjp13DnBwIB/v73v3PCCSewatUqAIYNG6bCFxGRiOaSkX7N2b59O+PHj2fJkiVccMEFnHTSSTX47CIiIs5xxUjf1NBKviVLlpCZmcm7777LY489xgsvvEB6enqNPLeIiIjTXDHSrykfffQRjRo14q233qJTp05OxxEREalR7hjpH8P3rl+/ng8++ACAKVOmsGrVKhW+iIi4kjtK/yhbf8GCBXTr1o1Jkybh9/vxer0kJibWbDgREZE6IipLv7CwkEsvvZSLL76YLl26sHjxYq3MFxER13PF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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams[\"font.sans-serif\"] = [\"SimHei\"]\n",
    "def plot_roc_curve(fpr, tpr,label = None):\n",
    "    plt.plot(fpr, tpr, linewidth = 2, label = label)\n",
    "    plt.plot([0,1],[0,1],\"k--\")\n",
    "    plt.axis([0,1,0,1])\n",
    "    plt.xlabel(\"假正类率\", fontsize = 16)\n",
    "    plt.ylabel(\"假正类率\", fontsize = 16)\n",
    "\n",
    "plt.figure(figsize=(8,6))\n",
    "plot_roc_curve(fpr,tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9654273376346892"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 召回率TPR越高，分类器的假正类FPR就越多\n",
    "# 虚线表示随机分类器的ROC曲线，好的分类器应该远离这条线，向左上角\n",
    "# 是使用精度/召回率PR曲线，还是使用ROC，关键在于非正类非常少或者更关注假正类而不是假负类，选择PR，反之ROC\n",
    "#  例如：前面的例子ROC曲线很不错是因为跟负类 非5相比，正类 数据5 数量是真的很少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练随机森林分类器，比较SGD分类器的ROC曲线和ROC  AUC分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取训练集中每一个实例的分数\n",
    "## RandomForestClassifier没有decision_function,但是拥有dict_proda方法，sklearn中分类器都有这两个中的一个\n",
    "## dict_proda返回一个矩阵，每行一个实例，每列代表一个类别的概率，比如这个图片70%是5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators = 10,random_state = 42)\n",
    "y_probas_forest = cross_val_predict(forest_clf,X_train,y_train_5,cv=3,\n",
    "                                    method = \"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [0.8, 0.2],\n",
       "       [1. , 0. ],\n",
       "       ...,\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制ROC曲线，需要分数值而不是概率，直接使用正类发概率作为分数值\n",
    "\n",
    "y_scores_forest = y_probas_forest[:,1]\n",
    "fpr_forest ,tpr_forest,threshold_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0.2, 0. , ..., 0. , 0. , 0. ])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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r2OJSC7k9ip7FjdKPwBgrY0DLgA2AQtxXwjSvQPMy8OMIlJArF27lhYtWnDXXXfx1VdfAajgixQiuSr61toka+091tp9mZbFWmsPWWsvtNYeyrT8BWvt4vwIm52NG2Ht2mDuUaRosdYyceJEmjdvzs6dO5k1axYdO3b0OpaInKDctvQLtIcfNnTt6nUKEf+65557GDhwIK1btyYuLo6LLrrI60gichJynBPTGFMMqG6t3ZKLdc8Axlhrr8uLcLlV919QU6frieSb6667jurVqzNkyBBCQnzRVhApko57yh6AMaYpsMhaWzLTsmrA50CrzF37xpiotHXL5FPeo0RUr2c/mLWQy6NqBGuXIr6XmprKU089xb59+xgzZozXcUQki/w6ZQ/gEJB1at1kIApIyrI86Rjrikghsm3bNrp27crDDz/Mpk2bCASCfg0tEcknuSn6qWk/maWAu/xuluX6dBApxD7//HOioqL47rvveP3115k+fbq680V8xBf/m28bCJdc4nUKkcJt586dXHvttdSoUYMVK1Zw8803YzTjlYiv+OLi1vH7YI8+m0ROyo4dO6hatSpVqlRh1qxZtGjRguLFi3sdS0TyQW5b+uWMMb+l/wBxgMm8LG353PyLmr1XXoEZM7zYs0jhNm3aNM4880zeeecdANq1a6eCL+JjuW3pHwIezcV6NYAhJx/n5JQrB1WqBHuvIoXX/v37GTRoEG+++SZt27alTZs2XkcSkSDIbdE/bK2dmtNKaXPxB73oi0jurVy5kpiYGH799VdGjhzJww8/TLFivjjSJyI58MX/9FdfgT8awe23e51EpOD79ddfSUxMZMGCBbRr187rOCISRLmZnKc+8J21tkLa/QFAW44+jQ+gHHBh+rrBEFG9ni0WuZCLG9Tgf/8L1l5FCpe//vqLJUuWcNlllwFw4MABXQZXpBA72cl5ctPSNxw54K8kUIG0c/WzKH2iAfLCwFvhknO92LNIwbdgwQJ69erFgQMH2LRpE+XLl1fBFymiclP0i6f9AGCtfRF48VgrGmPOAYJ6hT2ACy+EzlHB3qtIwZaSksLIkSMZPXo0Z511Fp9//jnly5f3OpaIeCjHom+t/Z5MRT8H4UCJU0okIqcsOTmZjh07smjRIm666SZefPFFte5FJM9n5FsDnJ7H28zR8uWwalWw9ypScIWFhdGtWzem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EyYwaNAgpk2bBsCiRYt45JFHeOyxx0hJSWHkyJHF3n/06FHatGnD6NGjad26NZs3b9YRQ5WYmJJ3plQyAQ2amviRnzM3qYG3Q7lmqampPP/888TExPDOO+9wU8nxPUopt9u9ezfNmjXzdhiqiivreygiW40x95S3Xlt07996q7cjuDbGGESEuLg4/P39GTt2LL6+vt4OSymllM3Yonu/ZQtvR3B1CgoKePnll+nduzfGGBo3bsz48eM14SullHILWyT9yujYsWN06dKFcePGUVBQQE5OjrdDUkopZXO2SPrZlWwK6DVr1tCyZUvS09OZM2cOH3zwAUFBQd4OSymllM3ZIukvX+7tCFyXnZ1NfHw8ISEhbNmyheHDh+u0lkoppTzCFjfy1fxd2WW87dChQ9x0000EBwfz6aefEh4erjNaKaWU8ihbnOl37uztCK5syZIl3HXXXUXjYiMiIjThK6WU8jhbJP3rVVZWFsOGDaNv3740b96c/v37ezskpZRSVZgmfTf57rvvuOeee1iwYAGJiYmkp6cTFhbm7bCUUkpVYbZI+hu+9HYElzp//jzZ2dmsXbuWF154AT8/P2+HpJSqghYtWoSIICL4+Phwyy23MHbs2KIldd1xPE+d4Ozfv7/os5V8LFq0yCMxVDa2uJHv3DlvR2DJzMxk2bJlPProo7Ru3Zo9e/bg7+/v7bCUUootW7aQl5fH119/TXJyMseOHePtt9/2dlgVYs6cOdx9993Ftt16HU3Vun37dtavX8/o0aO9HYo9kn77dt6OAD7//HPi4uI4fvw4Dz74IGFhYZrwlVLXjXvusaZpb9euHVlZWUyZMoU333yTgIAAL0d27W6//faiz3c92r59OzNnzrwukr4tuvdr1PDesfPz80lJSSEmJoagoCA2btyo1+6VUte1qKgo8vLyyMzM9HYoysNskfS9xRhD9+7dmTx5MnFxcWzdupWoqChvh6WUUld07NgxRISQkBAOHz5MbGwsNWvWpH79+owZM4aCggLg4jXz7du306tXL6pXr84dd9zBxo0bi+r64YcfaN++PYGBgbRt25Z9+4qvdX7y5EkGDBhA9erVqV+/PpMnT6Zwddfo6GiGDx9Oq1atqFOnDitXrqRt27bUqlWLpUuXVshnzc3NZdSoUdSpU4fatWszatQocnNzi/avX78eEeHChQukpqYSFhZW7LLHb7/9xvjx4wkNDSUkJIT4+HjOnDlTtP/MmTMMHjyYevXqUatWLXr06EFGRgYAKSkpiAhDhgzhwIEDRfcbpKSkVMhnuxq26N7fsxc6R3j+uCJC//796devHwMHDvR8AEopjwh7bqW3QwBg/0t/uOY6vv/+e1566SU6dOhAQEAAcXFxZGZm8tFHH3Hq1CkSEhJo2bIl8fHxRe8ZOHAg0dHRLF26lPHjx/P444+zbds28vPziY2NpW7duixbtoyvv/6a1NTUYsuC9+3bl/379/Puu+9y9OhRxo4di7+/PxMmTABg8eLFLFq0iClTphAbG0taWhrvvfce8+bNIzY29po/76hRo1ixYgWzZ89GRBg9ejR5eXnMnTu3WLnCzzR69GhatWpVtD05OZm33nqLWbNmUa1aNZ566ikSEhJ47733AEhKSmLt2rXMnz8fEWHixIkkJiaSlpZGQkICXbt25eOPP2bevHksd0wf681l022R9A/s99yxcnJyePbZZ4mKimLIkCEMGDDAcwdXSqmr5Dzdd1RUFPPnz8cYQ//+/Wnfvj3NmzcnPz+f2bNns3nz5mJJv1mzZsyaNQuAxMRE+vbtC1jriOzZs4dVq1YRHh5Ox44d2bZtG99++y0AGzZsYM2aNWzbto3IyEjAmoo8OTmZp59+GoB+/frRo0cPli1bRmhoKPHx8ezbt4/09HSXP1tMTEyx1/v27SMsLIyDBw8yf/58Pvzww6IfEAEBAfTq1YukpCRuvvnmovfs3r2bDRs2FLsX6/z588ycOZO5c+fSu3dvAE6cOMGf//xncnJyCAwM5ODBg7Rs2ZLu3bsD0LRpU3799VfASu433XQTu3btwt/f/7q478AWST+8iWeOs3v3bvr27cvOnTtJTEz0zEGVUl5XEWfY3rZt2zaOHDlC165dGTduHI0aNQKgd+/eLFiwgHHjxrFp0yZOnjxZtK9QQkJC0fOQkBDy8/MB2LNnD3Xq1CE8PLxo/wMPPFCU9Ldv307NmjWLEj5YXfpZWVns3bsXgAYNGgDWjxLn5+WRlpZWLKEWnknv3LmTgoICoqOjix2/oKCAnTt3Fkv6r7766iU3X+/du5fc3Fzi4+OL/QgCOHjwILfddhtDhw6lV69etGvXjvvuu4+OHTvSoUOHcsXvSbZI+reGubd+YwwLFy5k1KhRBAcHs3LlSrp06eLegyqlVAWKjIwkMjKS7t27M23aNPr06cPZs2eJiorixhtvpH///iQnJ/PGG29c8t7LDX8rKCjAx6f4rWG+vr7FXpdM4IWvC6/rV4QmTZoU+2FRknMMlzu+c5d+ocIy77//Pk2aFD+7LPxh1K1bN/7973+zevVq0tPT6dy5M48//jgzZ868ug/jZnojnwu++eYbhg4dSps2bdixY4cmfKVUpZWYmMi2bdv47LPPWLduHfv27WPVqlU8+eST3HvvvUVn4M5KJvJC4eHhZGZmcvDgwaJtX355cba0yMhITp06xc6dO4u2paenExwcTNOmTSvwU5WuRYsW+Pj4FLtUkJ6ejo+PDy1atCjz/U2aNMHf35+cnJyiH03VqlXjlVde4eTJkwBMnz6dQ4cOMWLECBYvXsyUKVNYuHBhsXoCAwM5f/76WAPeFmf6p0+7p96MjAzq1atHq1atWL16NQ899NBlv/xKKVUZtG7dmg4dOjBt2jQmTZoEwMKFC4mIiGD27Nl89dVXLk9s06lTJ2655RYGDhxIUlISW7du5cMPP6Rhw4YA3HfffTz88MP06dOH6dOn88svv/D888+TlJTkkfkBGjVqxNChQxkxYgTnz5/HGMPTTz/NsGHDLrmEUZrg4GDGjBnDs88+izGGhg0bkpKSwsmTJ6lfvz4AP/74I4sXL+aFF14gKCiI5cuXXzJsOyoqihMnTjBv3jyaN2/Ohg0bGD9+vDs+cplscaa/9duKra+goIDp06cTFhbGli1bAOjYsaMmfKWULUycOJF169YRFBTExIkTefHFFxk4cCC1a9dm+PDhbN68mQsXLpRZj7+/P6tWrcLHx4fY2Fjef/99nnnmmWJllixZQlRUFP369SMpKYkxY8Z4NOHNmjWLnj17MmLECB577DF69uzJa6+95vL7U1NTGThwIM888wyxsbFFQwsLLxO8+uqrtGzZkiFDhtC1a1f8/Px45513itVx2223MWfOHFJTU4mOjr5kvydJRV5X8YaABk1N8kufkzS4QYXUd+zYMQYNGsSaNWvo2bMnaWlp1K5du0LqVkpd/3bv3k2zZs28HYYCLly4cMVr/zfcYIvO6lKV9T0Uka3GmHIPB7BFi91dQfPhrFmzhkGDBnH69GnmzJlDQkJCue8iVUopVTHCw8M5cODAZfdX9pNWb7BF0q8oGzdupG7duqxbt47mzZt7OxyllKrSPvnkE/Ly8rwdhq1U+aT/888/c/ToUdq3b09SUhLjxo0jKCjI22EppVSVd+edd3o7BNuxxY18X351de9bvHgxkZGRDBs2jAsXLuDr66sJXymllG3ZIuk7JodyWVZWFo8++ij9+/cnIiKC1atX6535Sqkieq1YeZM7v3+26N5v29b1shkZGdx///389NNPJCUlMWnSJFvfAaqUKp8bbriB/Px8/Pz8vB2KqqLy8/Pdlpdske38y/Fvs27dusTExPDGG29cskiDUkoFBgZy7tw5HaqrvObs2bMEBga6pW5bdO+XJTMzk7i4OH7++WdERBO+Uuqy6tWrR0ZGBtnZ2drNrzzKGEN2djYnTpygXr16bjmGLc70f/oJOkeUvi89PZ24uDiOHz9O9+7dady4sWeDU0pVKoGBgYSGhvLLL7+Qm5vr7XBUFRMQEEBoaKjbzvRtkfSPZ1y6LT8/n6lTp5Kamkp4eDibNm0iKqqCZvFRStlazZo1qVmzprfDUKrC2aJ7v2mTS7fNmDGDyZMnM2DAALZu3aoJXymlVJVnizP90NCLz8+dO0f16tUZOXIk4eHh9OzZ03uBKaWUUtcRW5zpA+Tk5PDEE0/QunVrsrKyqFatmiZ8pZRSyonHk76IzBeRjSKSdC1lnO38dg9t2rRh9uzZdOrUScfdK6WUUqXwaNIXkR6ArzGmLdBYRJpeTRlnF7LPkJzQiSNHjrBy5UpmzJhBQECAez6AUkopVYl5+kw/GviH4/ka4L6rLFOk4Pxpwm67mx07dtClS5cKClMppZSyH0/3g1cDDjue/wqUdkt9mWVEJAFIcLzM3bNrw66GDRtWcKiqhLrACW8HYXPaxu6nbex+2saecfvVvMnTSf8cULiMXXVK72kos4wxZh4wD0BEvjHG3FPxoSpn2s7up23sftrG7qdt7Bki8s3VvM/T3ftbudhd3xLYf5VllFJKKVVOnj7TXwp8ISI3AZ2BviIy1RiTdIUy93o4RqWUUsqWPHqmb4w5g3Wj3iYgxhizo0TCL63M6TKqneeGUNWltJ3dT9vY/bSN3U/b2DOuqp1FV5FSSimlqgbbzMinlFJKqSurNEnfHTP5qeLKaj8RqSkiq0RkjYj8U0T8PR2jHbj6PRWRUBHZ5qm47KQcbfy6iHTzVFx24sLfi9oi8omIfCMicz0dn104/g58cYX9fiKyQkS+FJFHy6qvUiR9d8zkp4pzsf3igBnGmP8GfgE6eTJGOyjn9/QVLg5fVS5ytY1F5H6gvjFmhUcDtAEX23gg8HfH8L0aIqLD+MpJRGoDb2HNX3M5o4Ctxpj2QC8RqXGlOitF0scNM/mpS0RTRvsZY143xnzmeFkPOO6Z0GwlGhe+pyLyIJCF9eNKlU80ZbSxiPgBacB+Efmj50KzjWjK/h5nAneJSC3gZuCQZ0KzlQtAH+DMFcpEc/H/xefAFX9cVZakX3KWvtCrLKMuz+X2E5G2QG1jzCZPBGYzZbaz47JJMvCcB+OyE1e+y4OAH4DpQGsRGeWh2OzClTbeANwCPAnsdpRT5WCMOePCCLZy5b7KkvQrZCY/dUUutZ+I1AFmAWVeO1KlcqWdnwNeN8ac8lhU9uJKG/8emGeM+QV4B4jxUGx24UobTwJGGGOmAD8CQzwUW1VTrtxXWRKjzuTnfmW2n+MM9H1ggjHmgOdCsxVXvqcPASNFZD0QKSJveiY023CljfcCjR3P7wH0+1w+rrRxbSBCRHyBNoCOD3ePcuW+SjFOX0R+B3wBrMMxkx/wiPPEPqWUudeFbhHl4GIbPwa8COxwbHrDGLPE07FWZq60c4ny640x0Z6LsPJz8btcA1iA1RXqB/QyxhwupTpVChfbuDWwEKuLfyPwJ2PMOS+EW+kV/h1w3OtzpzHmb077bgE+AdYC7bBy34XL1lUZkj4U3cX4MPC5o0vuqsqoy9P28wxtZ/fTNnY/bePrh2Pa+vuAT8s62a00SV8ppZRS16ayXNNXSiml1DXSpK+UUkpVEZr0lVJuJyK+IiLejkOpqk6TvlI2ISKxItLuMvsC3blWgoh0FJFnnF7/RUQ+dSryPLDCMXzLlfriHJNAKaUq0A3eDkApVWGSgf8VkRlY46ILTQDCgH4iYrAm8BhpjJkLICK/B3Ioexy1LxAIfGeMySux7zSQKCI3GmPGA7nAeUf9XYBxQP+SQ4kc0+HeAOQaYwqcdj0KZAPdnMr6Av5AgTEmt4xYlVKl0KSvlA2ISCMgAugOtAZijDHrRWQRVkIdAYxwlF2PNYtXoU1YSdo56fpjJXjnOb99HNtvxzGZjYgEAAJ8DfwB+GspC348DTxmjClcmdHHGJPj2NcH+BtwXkQKE7kf1g+QfBHZ71SPHxCMtRDRCy41jFKqGE36StnDYKyVtg47zubLUnTGbYwJKLlTROKBFGNMWBn1TAOeKrGt6IeCUywdRGSh4/kyINbxfLHjv6uNMScc71kM1HKUiQS2GGMKHCu5/QFrGmil1FXQa/pKVXIicgMwDOtsvdC/HAl3MBAoImtF5KyInMKaxONKS3WWRwoQAvgZYwRoAhwFfsJK7s2A5ViXF3yweg/6Ob0/CLgX+ElEHhaRD4D6WPO2JwLpQGfHOuHfAA0cdSilroKe6StV+Q3Buk7vLMYYs77whYj8Fav7PteUMiOXiDwFZBtj0spzYOdFgRxThL7reJzFWtTmHNYPjF3AM8aYeSXefw54QkTmAXlAT6yegs+wfhD8yRiz0nHfwWBjzNLyxKeUKk7P9JWqxBzX8l8CXr/M/kARuRFrKdl+wGARiReRu0oUfRh4oMQ2HxGp5fSoKyINSjlGS0eX/ArgL8aYp7Gu/QcYY/7PUfckYLaIrHDEU1IWcArrvoQHse4TGAA0FJEorLXZm+iwP6WujSZ9pSq3I1gJdWuJ7YXd++eBm4GXgTis6+QzgKYlyufjdJ3f4WbgpNMjA1jlXEBEWgHfYt1gF2mM+atTXKdExNdYZmAtzNKIEn93RKQzsBnogNUrsAzr7v0PgY5YC+OEYY1C+EBEgstqFKVU6TTpK1WJGWPynVfcchLjuMYehJWUPwH+ZoyJxepG/8aF6g8YY6TwgXX3fMl5AHYBzY0xfzTG7CmxrzVOIwKMMWsd24pGDohIIvA/WD0Ru7FWY6sBvIY1DLAN0ByIwloCtwXWHf9Kqaug1/SVsilHV3hhd/haoJOI7MS6dn+ovPUZY/KxegScrQL+6wq97gWX2Sci4gO8B/zDGLPXsbEN1nrg84GfjTGjHUu0HjLGHBWRSMA4ehAuu3yoUqp0mvSVsqd/OT2/FfgIa1Y8A8yuwON0cdRZNLmOiNwObAcOAyuMMWMKCzvG6RcOEYzAuiyRJyIlJ/uphvWDId7pvXBxroCOWHf2K6XKQZO+UvZUODmPH5BvjDEisgbrWnn9ijqIMSbb+bVjXe+/Y3XZTwa+cvQ4TDDGnHfM5JfneO8OLvM3SESWAvuNMaMrKlallF7TV8oufLn479mvcKMx5jeguogkA52AHcACEQl1LIITKSLNsIb81RSRO0TkDqzx8H6Frx2POx3lm5Q8uIiEiMgYrDP83cCTxpgjQFusa/G7RGSUiNR0XxMopcqiZ/pK2UMgFyetKZphz7EAz2qsO+KjsO7Cnwn8gHVT3GaKz7u/qUS9JV/7Oerr6ah/NNZQwN8D3wPDjTH/LCzsuA4fDSRgTeQzQ0SWGGMGlPF5nH/EKKUqiJQyT4dSykZEJNQYc6zEtrqF095eY93tgYeApY7u+iuVDcAaMnjEGPNFGWU/A/YZYxKuNUal1EWa9JVSSqkqQrvPlFJKqSpCk75SSilVRWjSV0oppaoITfpKKaVUFaFJXymllKoiNOkrpZRSVcT/A8Ep+LcYQ/1LAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,6))\n",
    "plt.plot(fpr,tpr,\"b:\",linewidth = 2,label = \"SGD\")\n",
    "plot_roc_curve(fpr_forest,tpr_forest,\"Random_Forest\")\n",
    "plt.legend(loc = \"lower right\",fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9929018862463104"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# RandomForest 比SGD 好很多，ROC  AUC 的分数也高很多\n",
    "roc_auc_score(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9854817421909371"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下精度和召回率也很高\n",
    "\n",
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train,y_train_5,cv=3)\n",
    "precision_score(y_train_5,y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8264157904445675"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多类别分类器\n",
    "# 1.尝试5之外的检测\n",
    "# 2. 多类别分类器区分两个以上的类别\n",
    "# 3. 随机森林和朴素贝叶斯可以直接处理多个类别\n",
    "# 4. 支持向量机SVM和线性分类器只可以处理二元分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 解决方案\n",
    "## 1. 将数字图片分类0到9，训练10个二元分类器，每个数字一个，检测一张图片时，获取每个分类器的决策分数，哪个最高属于哪个，称为一对多OvA\n",
    "## 2. 为每一对数字训练一个二元分类器，区分0，1；区分0，2和区分1，2称为一对一OvO策略，存在N个类别，需要N*(N-1)/2 个分类器，最后看哪个类别获胜最多\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 优缺点\n",
    "## 1. OvO只需要用到部分训练集对其必须区分两个类别进行训练\n",
    "## 2. 对于较小训练集合OvO比较有优势，大训练集合OvA速度快，所有OvA更常用，比如svm在数据规模扩大时表现糟糕\n",
    "## 3. skleanr检查使用二元分类算法进行多类别分类任务，会自动运行OvA，svm分类器除外\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['9'], dtype='<U1')"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train,y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-24459.85211035, -16165.16268362, -22615.22241061,\n",
       "         -5339.47438345,  -6157.65286014,  -9889.34862253,\n",
       "        -31757.3978841 , -10397.84401994,  -5472.17415651,\n",
       "         -4435.01107107]])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 内部实际上训练了10个二元分类器，获得图片的决策分数，然后选择了分数最高的类别\n",
    "# 返回10个分数，每个类别1个\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], dtype='<U1')"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 目标类别列表会存储在classes_这个属性中，按值大小排列\n",
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['9'], dtype=object)"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter = 5, tol =-np.infty,random_state =42))\n",
    "ovo_clf.fit(X_train,y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['9'], dtype=object)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林\n",
    "\n",
    "forest_clf.fit(X_train,y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0. , 0. , 0. , 0. , 0.1, 0. , 0. , 0. , 0. , 0.9]])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机森林直接将实例分为多个类别，调用predict_proba()可以获得分类器将每个实例分类为每个类别的概率列表\n",
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.8816 , 0.86905, 0.8647 ])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确度\n",
    "cross_val_score(sgd_clf , X_train, y_train,cv=3,scoring = \"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\anaconda\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:557: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.8935 , 0.8959 , 0.90145])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将输入进行简单缩放，可以得到准确率90%以上\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "\n",
    "cross_val_score(sgd_clf,X_train_scaled,y_train,cv=3,scoring = \"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 错误分析\n",
    "# 1. 项目流程 \n",
    "# 1.1 探索数据\n",
    "# 1.2 尝试多个模型\n",
    "# 1.3 选择最佳模型并用GridSearchCV对参数进行微调\n",
    "# 1.4 尽可能自动化\n",
    "\n",
    "# 2. 确定一个相对合适的模型，进一步优化，分析其错误类型\n",
    "# 2.1 查看混淆矩阵\n",
    "# 2.2 使用cross_val_predict()进行预测\n",
    "# 2.3 调用confusion_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\anaconda\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:557: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5587,    0,   14,    6,    7,   35,   30,    5,  238,    1],\n",
       "       [   0, 6405,   43,   21,    4,   38,    5,    6,  212,    8],\n",
       "       [  19,   27, 5218,   88,   72,   34,   66,   40,  386,    8],\n",
       "       [  25,   21,  112, 5207,    0,  196,   25,   45,  439,   61],\n",
       "       [   8,   12,   37,   12, 5219,    8,   30,   25,  342,  149],\n",
       "       [  23,   17,   29,  155,   51, 4436,   74,   22,  545,   69],\n",
       "       [  27,   19,   49,    4,   44,   88, 5534,    4,  149,    0],\n",
       "       [  20,   15,   45,   23,   50,   14,    4, 5689,  191,  214],\n",
       "       [  16,   66,   46,   88,    1,  126,   33,    8, 5422,   45],\n",
       "       [  20,   22,   27,   61,  126,   36,    1,  178,  378, 5100]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf,X_train_scaled, y_train,cv=3)\n",
    "conf_mx = confusion_matrix(y_train,y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib的matshow函数来查看混淆矩阵的图像表示\n",
    "\n",
    "plt.matshow(conf_mx,cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 看起来不错，大多数图片都在主对角线上，说明他们被真缺分类\n",
    "# 数字5看起来比较暗，说明要么数字5图片较少要么分类器在数字5上执行效果不如其他数字好\n",
    "#  假设把角度放在错误上，为取得错误率，而不是错误绝对值，需要将混淆矩阵中每个值除以相应类别中的图片数量\n",
    "\n",
    "row_sums = conf_mx.sum(axis = 1 ,keepdims =True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAEACAYAAABxpdD1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAALOUlEQVR4nO3dXYyedZmA8eueYdppl26ZKRQDMYQGw4GKupnUJawLGNe4CcYAAiZGiB9pNEaPMWrMerCbGOKJSYnjx57ofnmwG5q4QbJJs5pINjVEDrRCEyhGUuqIrTgwhc7ce9CZQGA67zPt859n5ub6HU37vtxzZ5JrnnfePvMnMhNJdY0NvYCktoxcKs7IpeKMXCrOyKXijFwqzsg7iIjdEfHfEfGTiPjPiNg29E5dRMSVEfHY0HusR0QcjIgPD71HFxExFRE/jogjEfHtofc5n0Eij4jvRcTPI+IrQ3z+C/Bx4JuZ+UHgBPChgffp6gFgx9BLdBUR7wPekpmHht6lo08AP8zMGWBXRMwMvdBqNjzyiLgDGM/MG4F9EfG2jd5hvTLzYGY+svzHK4CTQ+7TRUS8H5jn3DelTS8iJoDvAE9HxEeG3qejPwDviIjLgLcCvx14n1UNcSW/BfiP5Y9/AvzNADtckIi4EZjKzEeH3mUtyz9OfBW4f+hd1uFe4FfAN4D9EfGFgffp4mfANcAXgV8Dzw+7zuqGiPwvgN8tf/w8cOUAO6xbREwD3wI+NfQuHdwPHMzMU0Mvsg7vAWYz8wTwA+DWgffp4mvAZzPz68BR4JMD77OqISL/M6/+nHjpQDusy/KV8UfAlzLz+ND7dPAB4PMRcRh4d0R8d+B9ujgG7Fv+eAbYCl/nKeCdETEOvBfYlL8IEhv9CyoRcS+wNzMfiIh/AH6Tmf+yoUusU0R8DvhH4JfLf/VgZv77gCt1FhGHM/OWofcYJSJ2Ad/n3Cu7CeCjmfm7tf+rYUXEfuCfOfeS/efA7Zn552G3eqMhIv9L4KfA/wB/D/x1Zp7e0CWkN5ENjxzO/fsi8HfA/y7/DCapkUEil7RxNv2bXpIujpFLxQ0WeUQcGOpzXyh3bm+r7Qubf+chr+Sb+gtzHu7c3lbbFzb5zr5cl4rr9d31iNhyb9VHROfnZmbn52/Ff7UYHx9vMnc9X4v1fI0BlpaWLmSlkS6//PLOz11YWGBycrLz8+fm5i5kpZEyc9Uv3CVNPtsWMjEx0WTu2bNnm8yF9X1jWo9LL720ydzFxcUmcwFefPHFJnPvuOOOJnMBZmdnm81ejS/XpeKMXCrOyKXijFwqzsil4oxcKq5T5FvwdFVJy0ZGvhVPV5X0qi5X8lvYoqerSuoW+Zqnq0bEgeX/g8SRvpeTdPG63Na65umqmTkLzMLWvHddqq7LlfwXvPoS/V3A0822kdS7Llfy/wJ+GhFXsXy6atuVJPVp5JU8M//EuTffHgVu9fhkaWvp9KummflHXn2HXdIW4h1vUnFGLhVn5FJxRi4V96Y/423nzp1N5r700ktN5gK8/PLLTea2Onxyfn6+yVxod97dyZMnm8yFNgdmrnWOnldyqTgjl4ozcqk4I5eKM3KpOCOXijNyqTgjl4ozcqk4I5eKM3KpOCOXijNyqTgjl4ozcqk4I5eKM3KpOCOXijNyqTgjl4ozcqk4I5eK6/VI5ohg+/btfY4E2hxhu+LUqVNN5l533XVN5kK7I5lbfS2uvvrqJnOh3XHPd955Z5O5AIcOHWo2ezVeyaXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqbuTNMBGxG/g3YByYB+7JzDZ3Y0jqXZcr+ceBb2bmB4ETwIfariSpTyOv5Jl58DV/vAI42W4dSX3rfO96RNwITGXmo6/7+wPAgb4Xk9SPTpFHxDTwLeANd+1n5iwwCzA2Npa9bifpoo38mTwitgE/Ar6UmcfbrySpT13eePs08FfAlyPicETc03gnST3q8sbbg8CDG7CLpAa8GUYqzsil4oxcKs7IpeKMXCqu99Nax8b6/76xuLjY+8wVN9xwQ5O5jz/+eJO5Ld1+++1N5j788MNN5gJMTk42mbtnz54mcwH27t3b+8y5ubnzPuaVXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4no9knlpaYkzZ870ORKgyTHPK5555pkmcycmJprMBXjllVeazH3ooYeazN25c2eTuQALCwtN5j711FNN5gJcf/31vc984YUXzvuYV3KpOCOXijNyqTgjl4ozcqk4I5eKM3KpuE6RR8SVEfFY62Uk9a/rlfwBYEfLRSS1MTLyiHg/MA+caL+OpL6tGXlEbAO+Cty/MetI6tuoe9fvBw5m5qmIWPUJEXEAOND3YpL6Merl+geAz0fEYeDdEfHd1z8hM2czcyYzZ1osKOnirHklz8y/Xfk4Ig5n5mfarySpT53/nTwzb2m4h6RGvBlGKs7IpeKMXCrOyKXijFwqzsil4iIzexs2Pj6ek5OTvc1bsbi42PvMFdu2bWsy96abbmoyF+Cxx9r8QuBzzz3XZO6+ffuazAU4caLNr1TMz883mQtw7bXX9j7z2Wef5cyZM6veluqVXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqrvfTWnfs2NHbvBUtT2vdtWtXk7lzc3NN5gJMTU01mTs9Pd1k7rFjx5rMBYhY9YDSi3bzzTc3mQtw+PDhJnMz09NapTcjI5eKM3KpOCOXijNyqTgjl4ozcqk4I5eK6xx5RByMiA+3XEZS/zpFHhHvA96SmYca7yOpZyMjj4gJ4DvA0xHxkfYrSepTlyv5vcCvgG8A+yPiC699MCIORMSRiDjS533wkvrRJfL3ALOZeQL4AXDrax/MzNnMnMnMmVa/LCDpwnWJ/Biwb/njGeB4u3Uk9e2SDs/5HvD9iPgYMAF8tO1Kkvo0MvLMfAG4awN2kdSAN8NIxRm5VJyRS8UZuVSckUvFGblUXJd/J+8sM5scn7y0tNT7zBWtjnuenJxsMhdgbKzN9+bjx9vc59TyTshWt1K3Oqob4O677+595iOPPHLex7ySS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFRZ+nXY6NjeXExERv81bs3bu395krFhYWmsydnp5uMhfgiSeeaDJ3//79TeYePXq0yVyA+fn5JnNbneILsGfPnt5nnjp1irNnz656LK5Xcqk4I5eKM3KpOCOXijNyqTgjl4ozcqm4NSOPiKmI+HFEHImIb2/UUpL6M+pK/gngh5k5A+yKiJkN2ElSj0ZF/gfgHRFxGfBW4LftV5LUp1GR/wy4Bvgi8Gvg+eYbSerVqMi/Bnw2M78OHAU++fonRMSB5Z/Zj/R5H7ykfoyKfAp4Z0SMA+8F3lBxZs5m5kxmzkSsen+8pAGNivyfgFngNDAN/GvzjST16pK1HszM/wPevkG7SGrAm2Gk4oxcKs7IpeKMXCrOyKXijFwqzsil4no/knn79u29zVvR8k66sbE23+d2797dZC7AVVdd1WTuk08+2WTu6dOnm8wFuO2225rMveuuu5rMBbjvvvuazM1Mj2SW3oyMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXiej2tNSJ+Dxzv+PTLgbnePvnGcOf2ttq+sDl2viYzr1jtgV4jX4+IOJKZM4N88gvkzu1ttX1h8+/sy3WpOCOXihsy8tkBP/eFcuf2ttq+sMl3Huxnckkbw5frUnFGLhVn5FJxRi4VZ+RScf8PEIRMfGd1sD8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线，只保留错误，重新绘制\n",
    "\n",
    "np.fill_diagonal(norm_conf_mx,0)\n",
    "plt.matshow(norm_conf_mx,cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 每行代表实际类别，每列代表预测类别\n",
    "# 9 ， 9 列比较亮，说明许多图片被错误的分类为数字8 ，9\n",
    "# 类别8 ，9 行也偏高，说明数字8和9经常会和其他数字混淆\n",
    "# 有些很暗，比如行1，大多数数字1都能被正确分类，一些和8混淆\n",
    "# 5和3是错误最多的\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 结论\n",
    "\n",
    "# 1. 改进数字8和9的分类\n",
    "# 2. 修正数字3和5的混淆"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 如何优化分类器\n",
    "\n",
    "#1. 尝试多收集这些数字的训练集\n",
    "#2. 开发一些新特征来改进分类器\n",
    "#3. 优化分类器算法\n",
    "#4. 使用pillow或者opencv对图片预处理，让显示模型更突出\n",
    "#5. 分析单个错误\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances, images_per_row = 10,**options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances),images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances ]\n",
    "    n_rows = (len(instances)-1 ) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size,size * n_empty)))\n",
    "    for row in range (n_rows):\n",
    "        rimages = images[row * images_per_row:(row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages,axis = 1))\n",
    "    image = np.concatenate(row_images ,axis = 0)\n",
    "    plt.imshow(image,cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "    \n",
    "# 查看数字3和5 的例子\n",
    "from  collections import Counter\n",
    "c1_a, c1_b = 3, 5\n",
    "X_aa = X_train[(y_train == str(c1_a)) & (y_train_pred == str(c1_a) ) ]\n",
    "X_ab = X_train[(y_train == str(c1_a)) & (y_train_pred == str(c1_b) ) ]\n",
    "X_ba = X_train[(y_train == str(c1_b)) & (y_train_pred == str(c1_a) ) ]\n",
    "X_bb = X_train[(y_train == str(c1_b)) & (y_train_pred == str(c1_b) ) ]\n",
    "# Counter(X_aa)\n",
    "\n",
    "plt.figure(figsize = (8,8))\n",
    "\n",
    "plt.subplot(221);\n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "\n",
    "plt.subplot(222);\n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "\n",
    "plt.subplot(224);\n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 左侧两个是被分类为3的图片\n",
    "# 右侧两个是被分类为5的图片\n",
    "# 大多数错误分类的图片看起来还是非常明显的错误\n",
    "# 原因： SGD是一个线性模型，它所作的就是为每个像素分配一个各类别的权重，当他看到新的图像，将加权后的像素强度汇总，从而得到一个分数进行分类\n",
    "# 数字3和5在一部分像素位上有区别，所有分类器很容易将其弄混\n",
    "# 通过上面图像，如果书写3的连接点左移。分类器可能将其分类为数字5，这个分类器对图像位移和旋转敏感\n",
    "# 减少混淆的方法之一就是对图像进行预处理，确保位于中心位置且没有旋转\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多标签分类\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 为每个实例产生多个类别，例如照片识别多个人脸\n",
    "# 分类器经过训练可以识别小红，小白，小军，一张照片里有小红，小白\n",
    "# 经过分类器，应该输出【1，1，0】，是小红。是小白，不是小军\n",
    "# 输出多个二元标签的分类系统统称为多标签分类系统\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "                     metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n",
       "                     weights='uniform')"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= \"7\")\n",
    "\n",
    "y_train_odd = (y_train.astype(int) % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large,y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train , y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True,  True]])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# knn支持多标签分类，不是所有的分类都支持\n",
    "\n",
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9766981214667163"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 评估多标签分类器方法很多，方法之一就是测量每个标签的F1分数，或者其他二元分类器指标，然后简单平均\n",
    "y_train_knn_pred = cross_val_predict(knn_clf,X_train,y_multilabel,cv=3)\n",
    "f1_score(y_multilabel,y_train_knn_pred,average=\"macro\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个等于自生支持的权重（该目标标签实例的数量），设置average=“weighted\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多输出分类\n",
    "## 例子，构建一个系统去除图片中的噪声，输入一张有噪声的图片，它将输入一张干净的数字图片，分类器输出是多个标签，一个像素一个标签，每个标签多个值（0--255）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加噪声，目标将图片还原为原始图片，床架训练集和测试集\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "noise = np.random.randint(0,100,(len(X_train),784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0,100,(len(X_test),784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda\\anaconda\\lib\\site-packages\\ipykernel_launcher.py:4: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
      "  after removing the cwd from sys.path.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);\n",
    "plt.imshow(X_test_mod[some_index].reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.subplot(121);\n",
    "plt.imshow(y_test_mod[some_index].reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod,y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
